﻿//BestByPriceQuotingStrategy.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Strategies
{
	using Ecng.ComponentModel;

	using StockSharp.BusinessEntities;

	/// <summary>
	/// Котирование по лучшей цене. Для данного котирования указывается отступ от лучшей цены <see cref="BestPriceOffset"/>,
	/// на который может уйти котируемая заявка.
	/// </summary>
	public class BestByPriceQuotingStrategy : QuotingStrategy
	{
		/// <summary>
		/// Создать <see cref="BestByPriceQuotingStrategy"/>.
		/// </summary>
		/// <param name="quotingDirection">Направление котирования.</param>
		/// <param name="quotingVolume">Объем, который необходимо скотировать.</param>
		public BestByPriceQuotingStrategy(OrderDirections quotingDirection, decimal quotingVolume)
			: base(quotingDirection, quotingVolume)
		{
			_bestPriceOffset = this.Param("BestPriceOffset", new Unit());
		}

		/// <summary>
		/// Создать <see cref="BestByPriceQuotingStrategy"/>.
		/// </summary>
		/// <param name="order">Заявка, которую необходимо котировать.</param>
		/// <param name="bestPriceOffset">Отступ от лучшей цены, на который может уйти котируемая заявка.</param>
		public BestByPriceQuotingStrategy(Order order, Unit bestPriceOffset)
			: base(order)
		{
			_bestPriceOffset = this.Param("BestPriceOffset", bestPriceOffset);
		}

		private readonly StrategyParam<Unit> _bestPriceOffset;

		/// <summary>
		/// Отступ от лучшей цены, на который может уйти котируемая заявка.
		/// </summary>
		public Unit BestPriceOffset
		{
			get { return _bestPriceOffset.Value; }
			set { _bestPriceOffset.Value = value; }
		}

		/// <summary>
		/// Получить приемлемый диапазон цены, попадая в который текущая заявка не будет перерегистрирована.
		/// </summary>
		/// <returns>Приемлемый диапазон цены. Если невозможно вычислить диапазон на данный момент, то будет возвращено null.</returns>
		protected override Range<decimal> GetAcceptablePriceRange()
		{
			var price = BestPrice;

			if (price == 0)
				return null;

			return QuotingDirection == OrderDirections.Sell
					? new Range<decimal>(price, (decimal)(price + BestPriceOffset))
					: new Range<decimal>((decimal)(price - BestPriceOffset), price);
		}
	}
}